package com.candy.util;

import java.sql.*;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * @author donglin
 * @Title:对JDBC的简单封装
 * @类名: DBHelper
 * @date 2021/1/6
 */
public class DBHelper {
    /*
     * 方法描述:获取数据库连接对象Connection
     *
     * @param
     * @return Connection
     *
    */

    public static Connection getConn(){
        Connection conn=null;
//        1、注册或实例化jdbc的驱动类
//        提供jdbc连接数据库的url字符串、数据库驱动类名、用户名、密码
//        jdbc:mysql固定格式；localhost：表示数据库服务器的访问地址（主机名：ip,其中localhost 127.0.0.1 表示主机）
//       3306：mysql数据库的默认监听客户端的端口号；端口号后边的是连接的数据库的库名
        String url = "jdbc:mysql://localhost:3306/ssm0916? characterEncoding=utf8 & useSSL=false & serverTimezone=UTC & rewriteBatchedStatements=true";
//       数据库驱动类名
        String strDBDriverType="com.mysql.cj.jdbc.Driver";
//        用户名
        String strUserName="root";
//        密码
        String strPwd="123456";
        try {
//        加载数据库驱动类
//        固定写法（反射）
            Class.forName(strDBDriverType);
//        2、获取数据库的连接对象Connection
            conn= DriverManager.getConnection(url,strUserName,strPwd);
//
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }
    /*
     * 方法描述:进行查询操作
     * @param strSql查询的sql语句
     * @return 查询结果集ResultSet
     *
    */
    public static ResultSet query(String strSql){
        ResultSet rs=null;
        try {
            Connection conn=getConn();
            Statement st=conn.createStatement();
            rs=st.executeQuery(strSql);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return rs;
    }
    public static List<Map<String,Object>>  query4ListMap(String sql){
//        用户存储查询结果数据
        List<Map<String,Object>> lst=new ArrayList<>();
        try (
                Connection connection=getConn();
                Statement st= connection.createStatement();
                ResultSet rs=st.executeQuery(sql);
        ){
//            解析结果集对象ResultSet，将ResultSet中的数据转储到List+Map的数据结构中；
            Map<String,Object> mapEachRow=null;
//            获取表的结构信息
            ResultSetMetaData rsmd=rs.getMetaData();
//            获取信息的列数
           int columnCount= rsmd.getColumnCount();
           while (rs.next()){
//               每一行的数据以键值对的形式存储在map中，每一次循环都需要创建一个新的map
//               键值对指的是以数据库字段名为键（key）,以改行的数据中的列的值为键值对的值
               mapEachRow=new LinkedHashMap<>();
//               遍历当前行的列，从下标1开始
               for (int i = 1; i <=columnCount ; i++) {
//                   获取列名
                   String columnName=rsmd.getColumnLabel(i);
//                   通过列名获取对应的该行该列的值
                 Object columnValue=  rs.getObject(columnName);
                 mapEachRow.put(columnName,columnValue);
                }
//               将当前行的map存入到list对象中，list中的一个map对象表示查询结果集ResultSet中的一行
               lst.add(mapEachRow);
           }
        } catch (Exception e) {
            e.printStackTrace();
        }
    return lst;

    }





    /*/**
     * 方法描述 执行增删改查操作
     * @param strsql需要执行的sql语句
     * @return int影响行数
     *
    */
    public static int update(String strsql){
        int i=0;
        try( Connection conn=getConn();
             Statement st=conn.createStatement();)
        {

          i=  st.executeUpdate(strsql);

        } catch (SQLException e) {
            e.printStackTrace();
        }
        return i;
    }












}
